package de.muyat.kablosuzizci.istemci;

import tr.muyat.kablosuzizci.istemci.yardimcilarmodulu.FormatHatasi;
import tr.muyat.kablosuzizci.istemci.yardimcilarmodulu.Kullanislilar;

/**
 * x, y, z uclusunden olusan bir koordinati temsil eder.
 * 
 * @author Dzhoshkun Ismail Shakir
 *
 */
public class Koordinat implements Dondurulebilir3f {
	private float x;
	private float y;
	private float z;
	/**
	 * Bu sinifin her objesi bu kadar byte olarak serilestirilir.
	 */
	public static final int DIZIN_BYTE_UZUNLUGU = 3 * 4;
	
	@SuppressWarnings("unused")
	private Koordinat() {
		
	}
	
	public Koordinat(float x, float y, float z) {
		this.x = x;
		this.y = y;
		this.z = z;
	}
	
	/**
	 * @return x
	 */
	public float getX() {
		return x;
	}
	
	/**
	 * @return y
	 */
	public float getY() {
		return y;
	}
	
	/**
	 * @return z
	 */
	public float getZ() {
		return z;
	}

	/**
	 * 
	 * @return koordinat bilgilerinin byte dizini olarak serilestirilmis hali
	 */
	public byte[] serilestir() {
		byte[] serilestirilmisKoordinat = new byte[DIZIN_BYTE_UZUNLUGU];
		byte[] x = Kullanislilar.byteDizinineDonustur(this.x);
		byte[] y = Kullanislilar.byteDizinineDonustur(this.y);
		byte[] z = Kullanislilar.byteDizinineDonustur(this.z);
		System.arraycopy(x, 0, serilestirilmisKoordinat, 0, 4);
		System.arraycopy(y, 0, serilestirilmisKoordinat, 4, 4);
		System.arraycopy(z, 0, serilestirilmisKoordinat, 8, 4);
		return serilestirilmisKoordinat;
	}
	
	/**
	 * 
	 * @param serilestirilmisKoordinat
	 * @param offset verilen dizinin neresinden baslayayim okumaya?
	 * @return parametre olarak girilen byte dizininden elde edilen obje
	 * @throws FormatHatasi
	 */
	public static Koordinat seridenOku(byte[] serilestirilmisKoordinat, int offset) throws FormatHatasi {
		byte[] x = new byte[4];
		byte[] y = new byte[4];
		byte[] z = new byte[4];
		System.arraycopy(serilestirilmisKoordinat, 0, x, 0, 4);
		System.arraycopy(serilestirilmisKoordinat, 4, y, 0, 4);
		System.arraycopy(serilestirilmisKoordinat, 8, z, 0, 4);
		return new Koordinat(Kullanislilar.floataDonustur(x), Kullanislilar.floataDonustur(y), Kullanislilar.floataDonustur(z));
	}
	
	/**
	 * Bu nesnenin butun degerleri {@code baska} bir nesneden kopyalanir. Surekli yeni
	 * nesne yaratmamak icin boyle bir hack gerekti.
	 * @param baska
	 */
	public void kopyala(Koordinat baska) {
		this.x = baska.x;
		this.y = baska.y;
		this.z = baska.z;
	}
	
	/**
	 * Koordinati, verilen {@code hiz}i, {@code sure} boyunca uygulayarak guncelle.
	 * @param hiz m/s
	 * @param sure saniye (s)
	 */
	public void guncelle(Hiz hiz, float sure) {
		this.x += hiz.getX() * sure;
		this.y += hiz.getY() * sure;
		this.z += hiz.getZ() * sure;
	}

	@Override
	public float[] vektorlestir() {
		return new float[]{x, y, z};
	}

	@Override
	public void vektordenKopyala(float[] vektor)
			throws IllegalArgumentException {
		if (vektor.length!=3)
			throw new IllegalArgumentException();
		
		x = vektor[0];
		y = vektor[1];
		z = vektor[2];
	}
}